package process

import (
	"encoding/csv"
	"github.com/lishimeng/go-log"
	"os"
	"path"
	"path/filepath"
	"strings"
)

var dataRoot = "./data/keywords_contribution"

func fileExt(p string) string {
	return strings.ToLower(path.Ext(p))
}

func procFile(handler func(file string)) (err error) {
	if handler == nil {
		return
	}
	err = filepath.Walk(dataRoot, func(path string, info os.FileInfo, e error) error {

		if fileExt(path) == ".csv" {
			handler(path)
			e = os.Remove(path)
			if e != nil {
				log.Info(e)
			}
		}

		return e
	})
	if err != nil {
		log.Info(err)
	}
	return
}

func (c *AnalysisContext) procCollectKeywords() (doNext bool) {

	log.Info("开始收集关键词数据...")
	err := procFile(func(file string) {
		c.procInputFile(file)
	})

	if err != nil {
		doNext = false
		return
	}
	if len(c.input) == 0 {
		log.Info("无数据")
		doNext = false
		return
	}
	log.Info("源文件有效数据量: %d", len(c.input))
	doNext = true

	return
}

func (c *AnalysisContext) procInputFile(f string) {
	file, err := os.Open(f)
	if err != nil {
		log.Info(err)
		return
	}
	defer func() {
		_ = file.Close()
	}()

	log.Info("开始读取CSV文件: %s", f)
	reader := csv.NewReader(file)
	reader.Comma = ','
	if HasCsvTitle {
		_, _ = reader.Read()
	}
	for {
		select {
		case <-c.ctx.Done():
			return
		default:
			n := c.collectKeywords(reader)
			if n == 0 {
				return
			}
		}
	}
}

func (c *AnalysisContext) collectKeywords(reader *csv.Reader) int {
	line, err := reader.Read()
	if err != nil {
		return 0
	}
	c.convertKeywordInput(line)
	return 1
}

func (c *AnalysisContext) convertKeywordInput(line []string) {
	const maxFields = 20
	// 1  开始日期
	// 2  结束日期
	// 3  客户搜索词
	// 4  搜索词展示量排名
	// 5  搜索词展示份额
	// 6  投放
	// 7  匹配类型
	// 8  广告活动名称
	// 9  广告组名称
	// 10 货币
	// 11 点击量
	// 12 展示量
	// 13 点击率(CTR)
	// 14 花费
	// 15 每次点击成本(CPC)
	// 16 14天总订单数(#)
	// 17 14天总销售额
	// 18 广告成本销售比(ACOS)
	// 19 投入产出比(ROAS)
	// 20 14天的转化率

	var customSearchKeyword = getField(line, 3)
	if EmptyFilter { // 空词
		if emptyFilter(customSearchKeyword) {
			return
		}
	}
	t := InputConvert(line)
	c.input = append(c.input, t)
}

func getField(line []string, fieldNumber int) string {
	return strings.TrimRight(strings.TrimLeft(line[fieldNumber-1], " "), " ")
}
